{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "VVaXwqhBl8ZC"
   },
   "source": [
    "\n",
    "# NAMD Protein-ligand complex MD Setup tutorial using Jupyter Notebook\n",
    "\n",
    "This notebook is wrritten by quantaosun@gmail.com in Shanghai, China, 2021. \n",
    "This notebook took PDB ID 7L10, the protease of SARS-CoV-2 with an inhibitor, as an example, relative work was firstly published on ACS Cent. Sci. 2021, 7, 3, 467–475, by William L. Jorgensen, Yale University."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "aTCtNy4mnN_A"
   },
   "source": [
    "**The overall procedure is as below**\n",
    "0.   PDB structure check and fix with third-party tools or web server.\n",
    "1.   Installation of Anaconda,pymol, vmd, and openmm, pdbfixer\n",
    "2.   PDB ID provided by user\n",
    "3.   Separation of ligand and protein\n",
    "4.   Topology generation for ligand using LigParGen web server\n",
    "5.   Combine new ligand pdb and original protein, mannually renumber ligand atom\n",
    "6.   Generation of ionized.pdb and ionized.psf by VMD, with Charmm force field.\n",
    "7.   Generation of conf file for NAMD simulation. \n",
    "8.   NAMD simulation \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Download Github repository and create conda env"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "$ git clone https://github.com/quantaosun/NAMD-MD\n",
    "$ cd NAMD-MD\n",
    "$ conda create -n NAMD-MD python=3.7\n",
    "$ conda activate NAMD-MD\n",
    "$ (NAMD-MD) conda install jupyter\n",
    "$ (NAMD-MD) jupyter notebook\n",
    "$ # If you have problem opening jupyter notebook\n",
    "$ # conda remove jupyter\n",
    "$ # sudo apt isntall jupyter\n",
    "$ # jupyter notebook"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Starting Jupyter notebook and install dependencies, this may take a while"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "! yes | conda install -c conda-forge vmd &> /dev/null\n",
    "#@title Install VMD\n",
    "!yes | conda install -c conda-forge pymol-open-source &> /dev/null\n",
    "#install openmm\n",
    "!yes | conda install -c conda-forge openmm &> /dev/null\n",
    "#install pdbfixer\n",
    "!yes | conda install -c conda-forge pdbfixer &> /dev/null\n",
    "#install open babel\n",
    "!yes|conda install -c openbabel openbabel\n",
    "#install visualization\n",
    "! pip install py3Dmol &> /dev/null\n",
    "#install rdkit\n",
    "!yes | conda install -c rdkit rdkit &> /dev/null"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Use \"conda env list\" find your system path"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "sys.path.append('/home/sqt/anaconda3/envs/NAMD-MD/lib/python3.7/site-packages')\n",
    "#import rdkit for visualization purpose\n",
    "from rdkit import Chem\n",
    "from rdkit.Chem import AllChem\n",
    "from rdkit.Chem import Draw\n",
    "from rdkit.Chem.Draw import IPythonConsole\n",
    "from rdkit.Chem import DataStructs\n",
    "from rdkit.Chem import RDConfig\n",
    "from rdkit.Chem import rdBase\n",
    "from rdkit.Chem import MolFromPDBFile"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Visually check if your protein has multiple chains or just a single one."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 514
    },
    "id": "pp1LY8czS5Ru",
    "outputId": "e727474b-e71e-4efa-a8ee-e3cf83514f0d"
   },
   "outputs": [],
   "source": [
    "import py3Dmol\n",
    "view = py3Dmol.view(query='pdb:7l10')\n",
    "view.setStyle({'cartoon':{'color':'spectrum'}})\n",
    "view"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "k4MHHzof6sYM"
   },
   "source": [
    "# Download PDB "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "cellView": "form",
    "id": "Vx0M_FXDp74w"
   },
   "outputs": [],
   "source": [
    "PDB_ID = \"7L10???\" #@param {type:\"string\"}\n",
    "pdb = PDB_ID + \".pdb\"\n",
    "! wget https://files.rcsb.org/download/$pdb"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# (Optional) Skip pdbfixer if your protein has no missing loops"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#Only use this if your protein has a broken backbone\n",
    "#!pdbfixer 7L10.pdb --keep-heterogens=none --add-atoms=heavy --ph=7.0 --replace-nonstandard --output=receptor.pdbfixer.pdb"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# What is the name of your ligand? Check it out on RCSB PDB website !"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "v = py3Dmol.view(query='pdb:7L10',style={'cartoon':{'colorscheme':'ssPyMol'},'stick':{'radius':0.05}})\n",
    "v.setStyle({'resn':'XEY'},{'stick':{}})\n",
    "v.zoomTo({'resn':'XEY'})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Split protein and ligand, input the PDB ID and Ligand ID."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "cellView": "form",
    "id": "bAtKHO9H0wlX"
   },
   "outputs": [],
   "source": [
    "ligand_name = \"XEY????\" #@param {type:\"string\"}\n",
    "PDB_path = \"7L10.pdb??????\" #@param {type:\"string\"}\n",
    "!grep ATOM '{PDB_path}' > protein_no_H.pdb\n",
    "!grep HETATM '{PDB_path}' > ligand_1.pdb\n",
    "!grep '{ligand_name}' ligand_1.pdb > ligand_no_H.pdb"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Add hydrogen to ligand"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!obabel -ipdb ligand_no_H.pdb -opdb -O ligand_with_H.pdb -h"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "1uVJRwrOPktm"
   },
   "source": [
    "# Uplaod ligand_with_H.pdb to LigParGen to generate PDB,PRM and RTF three files.  http://zarbi.chem.yale.edu/ligpargen/index.html "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "XML_OXOj1Jag",
    "outputId": "a83373d7-f918-46c2-8ec7-94ec07965ffd",
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "com_file = open('combine_protien_ligand.pml','w')\n",
    "com_file.write('''\n",
    "load protein_no_H.pdb\n",
    "load XEY_51474E.pdb ???????????????\n",
    "select all\n",
    "save complex.pdb, all \n",
    "''')\n",
    "com_file.close()\n",
    "!pymol -c combine_protien_ligand.pml"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Modify VMD script and run psfgen"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "com_file = open('psfgen.tcl','w')\n",
    "com_file.write('''\n",
    "#psfgen for a single-chained protein with a ligand bound\n",
    "mol delete all\n",
    "mol load pdb complex.pdb\n",
    "set bad [atomselect top \"resname ACE\"]\n",
    "if {[info exists bad]} {\n",
    "set chainB [atomselect top \"protein and not hydrogen and not resname ACE NME\"]\n",
    "set chainX [atomselect top \"residuetype nothing and not resname ACE NME\"]\n",
    "set flag 1\n",
    "} else {\n",
    "set chainB [atomselect top \"protein and not hydrogen\"]\n",
    "set chainX [atomselect top \"residuetype nothing\"]\n",
    "set flag 0}\n",
    "$chainB writepdb chainB.pdb\n",
    "$chainX writepdb chainX.pdb\n",
    "package require psfgen\n",
    "topology top_all36_prot.rtf\n",
    "topology XEY_51474E.rtf??????????????????\n",
    "pdbalias HIS HSD\n",
    "pdbalias atom SER HG HG1\n",
    "pdbalias residue HIS HSE\n",
    "pdbalias atom ILE CD1 CD\n",
    "if {$flag == 1} {\n",
    "segment B {\n",
    "  first ACE\n",
    "  last CT3\n",
    "  pdb chainB.pdb\n",
    "}\n",
    "} else {\n",
    "segment B {\n",
    "  first NONE\n",
    "  last NONE\n",
    "  pdb chainB.pdb\n",
    "}\n",
    "}\n",
    "segment X {\n",
    "  first NONE\n",
    "  last NONE\n",
    "  pdb chainX.pdb\n",
    "}\n",
    "coordpdb chainB.pdb B\n",
    "coordpdb chainX.pdb X\n",
    "guesscoord\n",
    "regenerate angles dihedrals\n",
    "writepdb psf-complex.pdb\n",
    "writepsf psf-complex.psf\n",
    "exit\n",
    "''')\n",
    "com_file.close()\n",
    "!vmd -dispdev text -e psfgen.tcl"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Solvate the Complex and add ions "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "com_file = open('solvate.tcl','w')\n",
    "com_file.write('''\n",
    "package require solvate  \n",
    "solvate psf-complex.psf psf-complex.pdb -t 15 -o complex_wb \n",
    "package require autoionize\n",
    "autoionize -psf complex_wb.psf -pdb complex_wb.pdb -sc 0.15 -cation SOD -o ionized \n",
    "exit\n",
    "''')\n",
    "com_file.close()\n",
    "!vmd -dispdev text -e solvate.tcl"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# (Optional, you can skip this) Make restrain on alpha carbon of protein."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "com_file = open('restrain.tcl','w')\n",
    "com_file.write('''\n",
    "mol delete all\n",
    "mol load pdb ionized.pdb\n",
    "set all [atomselect top \"all\"]\n",
    "set sel [atomselect top \"protein and name CA\"]\n",
    "$all set beta 0\n",
    "$sel set beta 1\n",
    "$all writepdb restrained.pdb\n",
    "exit\n",
    "''')\n",
    "com_file.close()\n",
    "!vmd -dispdev text -e restrain.tcl"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Measure the water box dimensions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "com_file = open('measure.tcl','w')\n",
    "com_file.write('''\n",
    "mol delete all\n",
    "mol load pdb ionized.pdb\n",
    "set ubq [atomselect top all]\n",
    "measure minmax $ubq   \n",
    "measure center $ubq \n",
    "''')\n",
    "com_file.close()\n",
    "!vmd -dispdev text -e measure.tcl"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Modify NAMD configuration files"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Three parts in nvt.namd need modification, same for npt.namd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Periodic Boundary Conditions\n",
    "cellBasisVector1 ? 0 0\n",
    "cellBasisVector2 0 ? 0\n",
    "cellBasisVector3 0 0 ?\n",
    "cellOrigin ? ? ?\n",
    "wrapAll on\n",
    "# PME (for full-system periodic electrostatics)\n",
    "PME yes\n",
    "PMEGridSizeX ? ;# product of 2,3,5, slightly bigger than box vector\n",
    "PMEGridSizeY ? ;# product of 2,3,5\n",
    "PMEGridSizeZ ? ;# product of 2,3,5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "paraTypeCharmm on\n",
    "\n",
    "parameters                        top_all36_prot.prm\n",
    "parameters                        ???????????\n",
    "parameters                        toppar_water_ions.mod.str"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "run ???????? ;# 5000ps"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Run the simulation (This assume you have installed namd)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "cellView": "form",
    "id": "bRB2815xNyXi"
   },
   "outputs": [],
   "source": [
    "\n",
    "!namd2 +p2 nvt.namd > nvt.log\n",
    "#!namd2 +p2 npt.namd > npt.log\n"
   ]
  }
 ],
 "metadata": {
  "accelerator": "GPU",
  "colab": {
   "collapsed_sections": [],
   "name": "Copy of NAMD_MD0.ipynb",
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "10193f088e9240a796579932a0279b03": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "3ab0d0129ca64d76a2c93c7b1e59b292": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "3c137f0764824327acef0cb2c854bab5": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "DescriptionStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "DescriptionStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "description_width": ""
     }
    },
    "4b00d84c07a844ddad7792b77caced95": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_3ab0d0129ca64d76a2c93c7b1e59b292",
      "placeholder": "​",
      "style": "IPY_MODEL_10193f088e9240a796579932a0279b03",
      "value": "100%"
     }
    },
    "5614ed21ad704c71b682ebf7ed093116": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "7c74f1abdeaa46baa8ef759c34972cb2": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "b09278c4bcb44d11b6ba2a74fe7104fc": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HTMLModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HTMLModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HTMLView",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_e2db23fe40d84b81abf847de6adb36bf",
      "placeholder": "​",
      "style": "IPY_MODEL_3c137f0764824327acef0cb2c854bab5",
      "value": " 100/100 [elapsed: 04:48 remaining: 00:00]"
     }
    },
    "de2a82e34e5a4887aca6f200785b2a39": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "FloatProgressModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "FloatProgressModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "ProgressView",
      "bar_style": "success",
      "description": "",
      "description_tooltip": null,
      "layout": "IPY_MODEL_7c74f1abdeaa46baa8ef759c34972cb2",
      "max": 100,
      "min": 0,
      "orientation": "horizontal",
      "style": "IPY_MODEL_fd2af40e2ca2465ea4252203348584a3",
      "value": 100
     }
    },
    "e2db23fe40d84b81abf847de6adb36bf": {
     "model_module": "@jupyter-widgets/base",
     "model_module_version": "1.2.0",
     "model_name": "LayoutModel",
     "state": {
      "_model_module": "@jupyter-widgets/base",
      "_model_module_version": "1.2.0",
      "_model_name": "LayoutModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "LayoutView",
      "align_content": null,
      "align_items": null,
      "align_self": null,
      "border": null,
      "bottom": null,
      "display": null,
      "flex": null,
      "flex_flow": null,
      "grid_area": null,
      "grid_auto_columns": null,
      "grid_auto_flow": null,
      "grid_auto_rows": null,
      "grid_column": null,
      "grid_gap": null,
      "grid_row": null,
      "grid_template_areas": null,
      "grid_template_columns": null,
      "grid_template_rows": null,
      "height": null,
      "justify_content": null,
      "justify_items": null,
      "left": null,
      "margin": null,
      "max_height": null,
      "max_width": null,
      "min_height": null,
      "min_width": null,
      "object_fit": null,
      "object_position": null,
      "order": null,
      "overflow": null,
      "overflow_x": null,
      "overflow_y": null,
      "padding": null,
      "right": null,
      "top": null,
      "visibility": null,
      "width": null
     }
    },
    "fd2af40e2ca2465ea4252203348584a3": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "ProgressStyleModel",
     "state": {
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "ProgressStyleModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/base",
      "_view_module_version": "1.2.0",
      "_view_name": "StyleView",
      "bar_color": null,
      "description_width": ""
     }
    },
    "ff68e344e05449dbb4784f425e0c6594": {
     "model_module": "@jupyter-widgets/controls",
     "model_module_version": "1.5.0",
     "model_name": "HBoxModel",
     "state": {
      "_dom_classes": [],
      "_model_module": "@jupyter-widgets/controls",
      "_model_module_version": "1.5.0",
      "_model_name": "HBoxModel",
      "_view_count": null,
      "_view_module": "@jupyter-widgets/controls",
      "_view_module_version": "1.5.0",
      "_view_name": "HBoxView",
      "box_style": "",
      "children": [
       "IPY_MODEL_4b00d84c07a844ddad7792b77caced95",
       "IPY_MODEL_de2a82e34e5a4887aca6f200785b2a39",
       "IPY_MODEL_b09278c4bcb44d11b6ba2a74fe7104fc"
      ],
      "layout": "IPY_MODEL_5614ed21ad704c71b682ebf7ed093116"
     }
    }
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
